#ifndef _E_MAP_H_
#define _E_MAP_H_
#include "common.h"

#ifdef __cplusplus  
extern "C" {  
#endif 

// 在调用了if_map_delete\if_map_clear之后，这个回调来处理value
// 如果是safe状态，那么回调结束后会回收，不是safe状态,key将由你来释放内存
// value的必须要你来释放内存
typedef void (if_map_valueDeleteCallBack)(void *key, void* value);

// 初始化一个map
// capacity: -1表示自动扩容，0表示没有大小，put/get任何都会失败
// safe: FALSE 表示map不会为key生成一份copy，这样key有可能会被你修改，则会出错;
//       TRUE 则会为key生成一份copy，这样会导致内存稍微增大，但是key不会被修改
// key在移除的时候会始终删除
void* if_map_new(int capacity, BOOL safe, if_map_valueDeleteCallBack *vdcb);

// 放入一个key value
// return: 如果之前存在这个key，那么之前的值会返回
void* if_map_put(void* map, char* key, void* value);
// 得到value
void* if_map_get(void* map, char* key);
// map的value数量
int if_map_size(void* map);

// 得到所有values
// 配合size使用
void** if_map_values(void* map);
// 是否存在
BOOL if_map_has(void* map, char* key);
// 是否包含这个value值，简单的value == value
BOOL if_map_contain(void* map, void* value);
// 通过key，移出key-value
void* if_map_remove(void* map, char* key);
// 通过value，移出key-value
void* if_map_removeValue(void* map, void* value);
// 移出所有key-value
void if_map_clear(void* map);

// 释放map内存
void if_map_delete(void* map);

#ifdef __cplusplus  
}  
#endif 

#endif